/**
  ******************************************************************************
  * @file    sym32l010_hal_iwdt.c
  * @author  AE Team
  * @version 1.0.3
  * @date    2024-05-28
  * @brief   IWDT HAL module driver.
  *
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2024 SIYIMicro.
  * All rights reserved.</center></h2>
  *
  *
  ******************************************************************************
  */


/******************************************************************************/
/* Include files                                                              */
/******************************************************************************/
#include "sym32l010_hal_iwdt.h"


/*******************************************************************************
  * @brief  初始化IWDT并运行
  *
  * @param  IWDT_InitTypeDef:  初始化结构体
  *
  * @retval None
  */
void HAL_IWDT_Init(IWDT_InitTypeDef *InitStruct)
{
    SYM_IWDT->KR   = 0xCCCC;
    SYM_IWDT->KR   = 0x5555;
    SYM_IWDT->CR   = (uint32_t)InitStruct->Prescaler | (uint32_t)InitStruct->Action |
                     (uint32_t)InitStruct->DeepSleepMode;
    SYM_IWDT->ARR  = InitStruct->Reload;                              // 溢出周期为 ARR+1
    while (SYM_IWDT->SR & (IWDT_SR_CRF_Msk | IWDT_SR_ARRF_Msk)) { ; }
    SYM_IWDT->KR   = 0xAAAA;

    SYM_IWDT->KR   = 0x5555;
    SYM_IWDT->WINR = InitStruct->Window;
    while (SYM_IWDT->SR & IWDT_SR_WINRF_Msk) { ; }
    SYM_IWDT->KR   = 0xCCCC;
}


/*******************************************************************************
  * @brief  重载IWDT计数值，IWDT工作于非窗口模式
  *
  * @param  None
  *
  * @retval None
  */
void HAL_IWDT_Refresh(void)
{
    SYM_IWDT->KR = 0xAAAA;
}


/*******************************************************************************
  * @brief  重载IWDT计数值，IWDT工作于窗口模式
  *
  * @param  None
  *
  * @retval None
  * @note   两次调用之间的间隔必需大于100us
  */
void HAL_IWDT_Window_Refresh(void)
{
    uint32_t Cnt1, Cnt2;

    // 获取当前计数值
    do
    {
        Cnt1 = SYM_IWDT->CNT;
        Cnt2 = SYM_IWDT->CNT;
    } while (Cnt1 != Cnt2);
    

    // 计数值小于窗口值，则进行重载
    if (Cnt1 <= SYM_IWDT->WINR)
    {
        SYM_IWDT->KR = 0xAAAA;
    }
}


/*******************************************************************************
  * @brief  停止IWDT计数器
  *
  * @param  None
  *
  * @retval None
  */
void HAL_IWDT_Stop(void)
{
    SYM_IWDT->KR = 0x5A5A;
    SYM_IWDT->KR = 0xA5A5;
}


/************************ (C) COPYRIGHT SIYIMicro *****END OF FILE*************/
